INNER, RIGHT, LEFTの使い分け
内部結合
これは、両方のtableの直積の部分集合
だから、両方に存在するkeyのみの集合になる
外部結合
マスタとなる主を、左に書くか、右に書くかの違い
マスタ側にのみ存在するkeyがあった場合、そのkeyを削除せず結果に保存する
「keyを網羅したい」という仕様があれば、それをマスタにして外部結合すればいい
例
この2つのtableを結合する
table:dogs
id name owner_id
1 aka 1
2 ao 2
3 shiro 1
4 kuro 4
table:owners
id name
1 ichiro
2 jiro
3 saburo
CROSS JOIN
code:sql
SELECT * FROM dogs
CROSS JOIN owners;
table:table
id name owner_id id name
1 aka 1 1 ichiro ←
1 aka 1 2 jiro
1 aka 1 3 saburo
2 ao 2 1 ichiro
2 ao 2 2 jiro ←
2 ao 2 3 saburo
3 shiro 1 1 ichiro ←
3 shiro 1 2 jiro
3 shiro 1 3 saburo
4 kuro 4 1 ichiro
4 kuro 4 2 jiro
4 kuro 4 3 saburo
直積
4*3行ある
INNER JOINを包含する
LEFT OUTER JOINやRIGHT OUTER JOINは、
場合にもよるが基本的にはみ出るものと捉えておいていい
包含するケースはこのノートの一番下に書いた
INNER JOIN
code:sql
SELECT * FROM dogs
INNER JOIN owners
ON dogs.owner_id = owners.id;
table:table
id name owner_id id name
1 aka 1 1 ichiro
2 ao 2 2 jiro
3 shiro 1 1 ichiro
idが一致するものだけを抜き出す
CROSS JOINに包含される
LEFT OUTER JOINに包含される
RIGHT OUTER JOINに包含される
他の結果の←が付いている部分mrsekut.icon
LEFT OUTER JOIN
code:sql
SELECT *
FROM dogs
LEFT OUTER JOIN owners
ON dogs.owner_id = owners.id;
table:table
id name owner_id id name
1 aka 1 1 ichiro ←
2 ao 2 2 jiro ←
3 shiro 1 1 ichiro ←
4 kuro 4
マスタはdogs
例えば、dogsのkeyを網羅して結合したい、ような時に使う
kuroは、マスタ側にのみにあるので、これは残し、owners側はnullになる
RIGHT OUTER JOIN
code:sql
SELECT *
FROM dogs
RIGHT OUTER JOIN owners
ON dogs.owner_id = owners.id;
table:table
id name owner_id id name
1 aka 1 1 ichiro ←
2 ao 2 2 jiro ←
3 shiro 1 1 ichiro ←
3 saburo
マスタはowners
例えば、ownersのkeyを網羅して結合したい、ような時に使う
saburoは、マスタ側にのみにあるので、これは残し、dogs側はnullになる
一致する例
以下のようなデータの場合
table:dogs
id name owner_id
1 aka 1
2 ao 2
3 shiro 1
table:owners
id name
1 ichiro
2 jiro
はみ出るものがなく、互いに一対一対応しているので、
INNER, RIGHT, LEFTの結果はいずれも一致する
table:table
id name owner_id id name
1 aka 1 1 ichiro
2 ao 2 2 jiro
3 shiro 1 1 ichiro